
### 项目七 蓝牙遥控的原理及应用

**项目介绍：**

蓝牙是一种简单且便捷的无线通信模块，自过去几十年以来便广受欢迎，并且易于使用。如今，它已被广泛应用于大多数电池供电的设备中。

![image99](../media/3920253c86188ac64cf9b82c0df6c941.png)

多年来，蓝牙标准经历了多次升级，以满足客户的需求以及适应技术的发展变化，这些升级都是根据时代和环境的需要而进行的。

在过去几年里，许多方面都有了变化，包括数据传输速率、可穿戴设备和物联网设备的能耗以及安全系统。

接下来我们将学习如何使用 Arduino 板来连接蓝牙 模块。HM-10
是一款易于获取的蓝牙 4.0
模块。该模块用于实现无线数据通信。该模块是通过采用德州仪器的 CC2540 或
CC2541 蓝牙低功耗（BLE）系统级芯片（SoC）而设计的。

**蓝牙参数**：

蓝牙协议：蓝牙规范 V4.0 BLE

串行端口传输接收中无字节限制

![image100](../media/27e47e630140eb72f69dad02549438b4.png)

在开放环境中，能够实现与 iPhone 4s 进行 100 米的超远距离通信。

工作频率：2.4GHz ISM 频段

调制方式：高斯频率调制（GFSK）

传输功率：-23 分贝毫瓦、-6 分贝毫瓦、0 分贝毫瓦、6 分贝毫瓦，可通过 AT
命令进行调整。

灵敏度：在误码率为 0.1% 的情况下，≤ -84 分贝毫瓦。

传输速率：异步模式：6K 字节；同步模式：6k 字节

安全特性：身份验证与加密

支持服务：中央及外围 UUID 分别为 FFE0、FFE1

功耗情况：自动休眠模式下，待机电流为 400 微安至 800 微安，传输时电流为
8.5 毫安。

工作电压：DC 5 V

工作温度：-5 至 +65 摄氏度

**项目组件：**

| UNO PLUS 开发板\*1                                         | L298P 电机驱动扩展板 V1\*1                                 | LED白发红模块\*1                                           | Bluetooth-4.0 蓝牙4.0 V2\*1                                |
| ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- |
| ![image101](../media/67417bd98f12bffd0352f76063e5abbd.png) | ![image102](../media/3dca1bdd1d1420c1d12b16cbf52fee00.png) | ![image103](../media/31fb938502d3d519813c391569d6a3f3.png) | ![image104](../media/27e47e630140eb72f69dad02549438b4.png) |
| 3Pin 双母头杜邦线\*1                                       | USB线\*1                                                   | 18650双节电池盒 (18650电池*2 （电池自配）)* 1              |                                                            |
| ![image105](../media/07752ebfc8e8af62f1b86c4a725ea284.jpg) | ![image106](../media/2adb48888136bedc4d6b37d47a47b292.jpg) | ![image107](../media/c5bf59a8e5cdded95c02334369ab6fdd.png) |                                                            |

**接线图：**

1.  状态：状态测试引脚，与内部 LED 相连，通常保持其不连接状态。
2.  RXD：串行接口，接收端口。
3.  TXD：串行接口，发送端。
4.  GND：接地。
5.  VCC：电源的正极。
6.  EN/BRK：断开连接，意思是中断蓝牙连接，通常情况下，保持连接状态即可。

![image108](../media/ecc2c737f353cf9d7c69f391c6e1d452.png)

**蓝牙是直接插在电机驱动扩展板上的，注意一下方向，而且在上传代码之前不要插上蓝牙。**

**项目代码：**

（**特别提醒：在上传程序代码前，需要把蓝牙模块取下，否则代码会上传失败。需要上传代码成功后，再连接蓝牙模块。**）

``` c
/*
  迷你履带坦克机器人
  课程 7.1
  蓝牙
  http://www.keyes-robot.com
*/
char ble_val; //字符变量，用于存放蓝牙接收到的值
void setup() 
{
  Serial.begin(9600);
}
void loop()
{
  if (Serial.available() > 0) //判断串口缓存区是否有数据
  {
    ble_val = Serial.read();  //读取串口缓存区的数据
    Serial.println(ble_val);  //打印出来
  }
}
```

（上传代码之前不要连接蓝牙模块，因为代码的上传也是用的串口通信，跟蓝牙的串口通信会有冲突，导致代码上传不成功）

上传代码到开发板，然后再插上蓝牙模块。

**下载蓝牙测试APP：**

[**安卓系统手机APP**](./APP.7z)

1、扫码下载![image109](../media/e920dec9583352e3505ef6662868ec1a.png)或者进入APP下载链接：<http://8.210.52.206/Tank_Car.apk>

**注意：当我们扫码下载的时候需要使用手机浏览器的扫码功能扫码打开，使用微信扫码可能无效。**

2、下载后安装，安装成功，显示图标如下。

![image110](../media/9df8897348d5a2fbd8f03ac59bb6dbfc.png)

3、一定要先打开手机上的蓝牙开关，再点击上图图标**，进入APP，显示如下图。

![image111](../media/ed8437dc27ef31eda631a1c3e479d9c4.jpg)

4、上传代码成功后，正确插好蓝牙模块，上电后，点击APP![image112](../media/36b1f3e7cfca7e69178124d46abfa609.png)图标，搜索到蓝牙，显示如下图。

![image113](../media/bb404d78305d03db3a7f177559be1054.jpg)

5、点击 **connect** ，之后 **connect** 变成 **is connected**，说明蓝牙连接成功，显示如下图，蓝牙模块上LED变为常亮。

![image114](../media/ae8341f73f85054eaf73eca78172af0a.jpg)

**苹果系统手机APP**

1.  打开App Store。

![image115](../media/af6836387c7ddd16faa20396439cf0dd.png)

2.  点击搜索，搜索keyes，下载搜索到的keyes BT car。

![image116](../media/6ca6b22d85030f744a22a61abb70c261.png)

3.  打开keyes BT car。

![image117](../media/3c0249b480b0453172eb46c29d44078a.png)

4\. 一定要先开启手机蓝牙，再点击左上角的 **CONNECT**
按钮，进行蓝牙搜索和连接。

![image118](../media/5e92657dcaeaebeccbe0ef212daf04ec.png)

5.  点击坦克车的图片![image119](../media/94f5d814eb43dc21ebb341134e4e3ef4.png)按钮，进入控制坦克车的界面

![image120](../media/53cf64282791382b0dbdd7d9059bf99d.jpg)

在APP上点击各个按钮，等待手机发出的指令。指令如下：

![image121](../media/b410d8f9ec377d4af74ee037692791b7.png)

**代码说明：**

Serial.available()的意思是：返回串口缓冲区中当前剩余的字符个数。一般用这个函数来判断串口的缓冲区有无数据，当Serial.available()\>0时，说明串口接收到了数据，可以读取；

Serial.read()指从串口的缓冲区取出并读取一个Byte的数据，比如有设备通过串口向Arduino发送数据了，我们就可以用Serial.read()来读取发送的数据。

**项目拓展：**

上面的项目，我们讲解了蓝牙接收到手机发送的信号并且在开发板的串口显示出来，比如我们按下![image122](../media/2ea70aea70f675bf3683c6b8d849f2c7.png)，然后我们就会接收到‘B’，当我们松开的时候又接收到‘S’。那接下来我们就要想一下了，我们可以利用接收到的信号去做一些事情吗，答案是肯定的，我们这里就利用手机发送的命令去打开或者关闭一个LED灯。看接线图，在D9脚接了一个LED。

![image123](../media/a7e7871c480130fd7b3bfa7c27046993.png)

（**特别提醒：在上传程序代码前，需要把蓝牙模块取下，否则代码会上传失败。需要上传代码成功后，再连接蓝牙模块。**）

``` c
/*
  迷你履带坦克机器人
  课程 7.2
  蓝牙控制LED
  http://www.keyes-robot.com
*/
int ledpin = 9;
void setup()
{
  Serial.begin(9600);
  pinMode(ledpin, OUTPUT);
}
void loop()
{
  int i;
  if (Serial.available())
  {
    i = Serial.read();
    Serial.println("DATA RECEIVED:");
    if (i == 'B')
    {
      digitalWrite(ledpin, HIGH);
      Serial.println("led on");
    }
    if (i == 'S')
    {
      digitalWrite(ledpin, LOW);
      Serial.println("led off");
    }
  }
}
```

上传代码完成后，插上蓝牙模块，打开App，单击 **CONNECT**
连接上蓝牙，点击手机APP上![image124](../media/2ea70aea70f675bf3683c6b8d849f2c7.png)以控制LED。当您按住发送`B’‘时，LED将打开，而当您松开发送`S’’时，LED将关闭。

![image125](../media/26cb7b1cfaa0d52caa58cb12cc782562.png)